package com.hspedu.list_;

/**
 * ArrayList 和 LinkedList比较
 * ArrayList    可变数组    增删效率较低,数组扩容     改查效率较高  线程不安全
 * LinkedList   双向链表    增删效率较高,通过链表追加  改查效率较低   线程不安全
 *
 * 如何选择?
 * 1. 如果改查操作比较多,用ArrayList. 如果增删操作比较多,用LinkedList
 * 2. 一般来说,在程序中,80%到90%都是查询,大部分情况下用ArrayList
 * 3. 在一个项目中,根据业务灵活选择,
 *    也可能是一个模块使用ArrayList, 另一个模块使用LinkedList,要根据业务来看
 */
public class LinkedList01 {
    public static void main(String[] args) {
        Node jack = new Node("jack");
        Node tom = new Node("tom");
        Node hsp = new Node("laohan");

        /**
         * 连接三个节点, 形成双向链表
         * jack -> tom -> hsp
         */
        jack.next = tom;
        tom.next = hsp;
        //hsp -> tom -> jack;
        hsp.pre = tom;
        tom.pre = jack;

        Node first = jack;
        Node last = hsp;//让last引用指向hsp, 就是双向链表的尾节点

        //从头到尾遍历
        System.out.println("========从头到尾遍历=========");
        while(true){
            if (first == null){
                break;
            }
            //输出first信息
            System.out.println(first);
            first = first.next;
        }

        //从头到尾遍历
        System.out.println("========从尾到头遍历=========");
        while(true){
            if (last == null){
                break;
            }
            //输出first信息
            System.out.println(last);
            last = last.pre;
        }


        //链表的添加对象/数据,非常方便
        //要求, 在tom ------- laohan 之间插入一个对象 smith
        Node smith = new Node("smith");
        //把smith加入到双向链表
        smith.next = hsp;
        smith.pre = tom;
        tom.next = smith;
        hsp.pre = smith;

        //从头到尾遍历
        first = jack;//让first再次指向Jack
        System.out.println("========从头到尾遍历=========");
        while(true){
            if (first == null){
                break;
            }
            //输出first信息
            System.out.println(first);
            first = first.next;
        }


    }
}


//定义一个Node类, Node对象 表示双向链表的一个节点
class Node{
    public Object item;//真正存放数据
    public Node next; //后一个节点
    public Node pre;  //指向前一个节点

    public Node(Object name){
        this.item = name;
    }

    @Override
    public String toString() {
        return "Node name = " + item;
    }
}